//
//  ViewController.m
//  UI-26 GCD
//
//  Created by 韩旭 on 16/8/18.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *image;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    //   1. GCD Grand （伟大的） centeral（中央的）dispatch（调度）
    //   2.GCD 核心概念 队列，管理任务拆分分配到队列中，系统会自动为我们创建线程和调度线程，自动。
    //   3. GCD 中的队列严格尊循FIFO(先进先出)法则
    //    队列分为分类
    //    1. 串行  DISPATCH_QUEUE_SERIAL / NULL
    //    2. 并行  DISPATCH_QUEUE_CONCURRENT
    //   4. 队列的创建
    //    1> 队列名字
    //    2> 队列类型
    //    串行
    //    自己创建的队列
    dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
    //    并行
    //    系统提供的队列
    dispatch_queue_t queue2 =  dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
    //    主队列是串行
    dispatch_queue_t queue3 = dispatch_get_main_queue();
    // 全局对列
    //    参数1. 调度队列优先级
    //    参数2. 给未来使用 ， 占位使用默认填0
    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //    术语：
    //    串行， 一个任务执行完毕，在执行下一个
    //    并发，多个任务同时执行
    //    5。同步  异步
    //    同步 串行队列 (不会创建线程)
    //    同步 在当前线程做事， 不能开辟线程
    //    异步 在新创建的线程做事 执行任务，可以开辟线程
    //    同步串行队列 不会创建线程
    [self syncSerialQueue:queue];
    //    同步并发队列
    [self syncSerialQueue2:queue2];
    //    [self syncSerialQueue3Main:queue3];
    //   2> 异步
    //    串发 创建一条新的线程，在改线程中执行任务
    [self asyncSerialQueue:queue];
    //    并发 根据任务决定需要创建多少线程
    [self asyncCurrentQueue:queue2];
    //    异步主线程队例
    [self asyncMainQueue:queue3];
    //    异步全局队列 并发
    [self asyncSerialQueueglobal:global];
    dispatch_sync(queue, ^{
        NSLog(@"去你妹");
        for (int i = 0; i < 10; i++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
    //    同步 并发 (不会创建线程)
    dispatch_sync(queue2, ^{
        NSLog(@"同步并发");
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
    // 同步主线程 (不会执行)
    //    主线程等待同步操作结束，同步操作在主线程执行，互相等待 同步主线程，导致程序卡死
    //    dispatch_sync(queue3, ^{
    //        for (int i = 0; i < 10; i ++) {
    //            NSLog(@"%d -- %@", i, [NSThread currentThread]);
    //        }
    //    });
    //    [self syncSerialQueue3Main:mainQueue];
    //    同步全局队列 (不会创建线程) 并发的;
    dispatch_sync(global, ^{
        NSLog(@"同步全局队里");
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
    //    创建队列
    //  6. group
    //    dispatch_queue_t queueGroup = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
    dispatch_group_async(group, serialQueue1, ^{
        NSLog(@"队列");
        NSLog(@"%d -- %@", 1, [NSThread currentThread]);
    });
    //    组只有异步
    //    所有任务都执行完毕，会调用下列方法
    dispatch_group_notify(group, queue2, ^{
        NSLog(@"所有的完成了");
    });
    //    异步
    dispatch_queue_t queueNot = dispatch_queue_create("lianxi", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueNot, ^{
        [self performSelectorInBackground:@selector(练习) withObject:nil];
    });
}
- (void)LIAN {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //    返回主线程刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    });
}
- (void)练习 {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://gaoxiao.jokeji.cn/UpFilesnew/2012/7/12/201271225150721.jpg"]];
    [self performSelectorOnMainThread:@selector(onMain:) withObject:data waitUntilDone:YES];
}
- (void)onMain:(id)object {
    NSLog(@"回到主线程");
    _image.backgroundColor = [UIColor redColor];
    _image.image = [UIImage imageWithData:object];
}
//同步串行队列
- (void)syncSerialQueue:(dispatch_queue_t)queue {
    //        block中的内容会追加到 队列中
    dispatch_sync(queue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
- (void)syncSerialQueue2:(dispatch_queue_t)concurrent {
    NSLog(@"同步并发");
    dispatch_sync(concurrent, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
- (void)syncSerialQueue3Main:(dispatch_queue_t)mainQueue {
    NSLog(@"同步主对列");
    dispatch_sync(mainQueue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
//异步串行队列
//异步串行队列创建一个新的线程， 在该线程中执行；
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue {
    NSLog(@"异步串行队列");
    dispatch_async(serialQueue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}

//异步并发队列
//
- (void)asyncCurrentQueue:(dispatch_queue_t)concurrentQueue {
    NSLog(@"异步并发队列");
    dispatch_async(concurrentQueue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
- (void)asyncMainQueue:(dispatch_queue_t)mainQueue {
    NSLog(@"创建异步主线程队列");
    dispatch_async(mainQueue, ^{
        for (int i = 0; i < 10; i ++) {
            //            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
- (void)asyncSerialQueueglobal:(dispatch_queue_t)global {
    NSLog(@"创建异步全局队列");
    dispatch_async(global, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        }
    });
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end